package com.gsafety.wellsfort.common.util;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.push.model.v20160801.PushRequest;
import com.aliyuncs.push.model.v20160801.PushResponse;
import com.aliyuncs.utils.ParameterHelper;
import com.gsafety.wellsfort.common.constant.IConstant;
import com.gsafety.wellsfort.domain.dto.push.PushUtilDTO;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Optional;

/**
 * @Author: wuming
 * @Date: 2020/4/29 下午2:00
 * @Description 移动推送
 */
@Slf4j
public class MobilePushUtil {

    /**
     * android,ios 推送
     *
     * @param pushUtilDTO
     * @return
     */
    public static boolean pushMessage(PushUtilDTO pushUtilDTO) {
        log.info("内部请求push工具类参数={}", JSON.toJSONString(pushUtilDTO));
        try {
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", IConstant.ACCESS_KEY_ID, IConstant.ACCESS_Key_Secret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            PushRequest pushRequest = new PushRequest();
            pushRequest.setAppKey(pushUtilDTO.getAppKey());
            //推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
            pushRequest.setTarget("DEVICE");
            //根据Target来设定，如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
            pushRequest.setTargetValue(pushUtilDTO.getDeviceIds());
            //推送目标: DEVICE:推送给设备; ACCOUNT:推送给指定帐号,TAG:推送给自定义标签; ALL: 推送给全部
            pushRequest.setTarget("DEVICE");
            //根据Target来设定，如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
            // 消息类型 MESSAGE NOTICE
            pushRequest.setPushType("NOTICE");
            // 设备类型 ANDROID iOS ALL.
            pushRequest.setDeviceType(pushUtilDTO.getDeviceType());
            pushRequest.setTitle(pushUtilDTO.getTitle());
            pushRequest.setBody(pushUtilDTO.getBody());
            androidSetting(pushRequest);
            iosSetting(pushRequest);
            // 30秒之间的时间点, 也可以设置成你指定固定时间
            Date pushDate = new Date(System.currentTimeMillis());
            String pushTime = ParameterHelper.getISO8601Time(pushDate);
            /**延后推送。可选，如果不设置表示立即推送**/
            pushRequest.setPushTime(pushTime);
            // 12小时后消息失效, 不会再发送
            String expireTime = ParameterHelper.getISO8601Time(new Date(System.currentTimeMillis() + 12 * 3600 * 1000));
            pushRequest.setExpireTime(expireTime);
            // 离线消息是否保存,若保存, 在推送时候，用户即使不在线，下一次上线则会收到
            pushRequest.setStoreOffline(true);
            PushResponse pushResponse = client.getAcsResponse(pushRequest);
            if (!Optional.ofNullable(pushResponse).isPresent()) {
                return false;
            }
            log.info("阿里移动推送返回请求ID={},推送的消息ID={}", pushResponse.getRequestId(), pushResponse.getMessageId());
            return true;
        } catch (ClientException e) {
            log.error("阿里移动推送异常={}", e);
        }
        return false;
    }

    /**
     * ios配置
     *
     * @param pushRequest
     * @return
     */
    public static PushRequest iosSetting(PushRequest pushRequest) {
        // iOS应用图标右上角角标
        pushRequest.setIOSBadge(5);
        // iOS通知声音
        pushRequest.setIOSMusic("default");
        //指定iOS10通知Category
        pushRequest.setIOSNotificationCategory("iOS10 Notification Category");
        //是否允许扩展iOS通知内容
        pushRequest.setIOSMutableContent(true);
        //iOS的通知是通过APNs中心来发送的，需要填写对应的环境信息。"DEV" : 表示开发环境 "PRODUCT" : 表示生产环境
        pushRequest.setIOSApnsEnv("PRODUCT");
        // 消息推送时设备不在线（既与移动推送的服务端的长连接通道不通），则这条推送会做为通知，通过苹果的APNs通道送达一次。注意：离线消息转通知仅适用于生产环境
        pushRequest.setIOSRemind(true);
        //iOS消息转通知时使用的iOS通知内容，仅当iOSApnsEnv=PRODUCT && iOSRemind为true时有效
        pushRequest.setIOSRemindBody("iOSRemindBody");
        //通知的扩展属性(注意 : 该参数要以json map的格式传入,否则会解析出错)
        pushRequest.setIOSExtParameters("{\"_ENV_\":\"DEV\",\"k2\":\"v2\"}");
        pushRequest.setIOSSubtitle("");
        return pushRequest;
    }

    /**
     * android配置
     *
     * @param pushRequest
     * @return
     */
    public static PushRequest androidSetting(PushRequest pushRequest) {
        //通知的提醒方式 "VIBRATE" : 震动 "SOUND" : 声音 "BOTH" : 声音和震动 NONE : 静音
        pushRequest.setAndroidNotifyType("NONE");
        //通知栏自定义样式0-100
        pushRequest.setAndroidNotificationBarType(1);
        //通知栏自定义样式0-100
        pushRequest.setAndroidNotificationBarPriority(1);
        //点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
        pushRequest.setAndroidOpenType("URL");
        //Android收到推送后打开对应的url,仅当AndroidOpenType="URL"有效
        pushRequest.setAndroidOpenUrl("http://www.aliyun.com");
        // 设定通知打开的activity，仅当AndroidOpenType="Activity"有效
        pushRequest.setAndroidActivity("com.alibaba.push2.demo.XiaoMiPushActivity");
        // Android通知音乐
        pushRequest.setAndroidMusic("default");
        //设置该参数后启动辅助弹窗功能, 此处指定通知点击后跳转的Activity（辅助弹窗的前提条件：1. 集成第三方辅助通道；2. StoreOffline参数设为true）
        pushRequest.setAndroidPopupActivity("com.ali.demo.PopupActivity");
        pushRequest.setAndroidPopupTitle("Popup Title");
        pushRequest.setAndroidPopupBody("Popup Body");
        pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
        pushRequest.setAndroidNotificationChannel("1");
        return pushRequest;
    }

}
